/**
 * @file HelpCommandImpl.java
 * Projet eCOM 2010 (Miage Descartes)
 * @author Doido Sébastien
 * @version 2
 * @brief Shell : Gestion de l'aide pour le shell
 */
package ecom.shell;

import java.io.PrintStream;

/**
 * @brief Shell : Gestion de l'aide pour le shell
 * @author Sebastien
 */
public class HelpCommandImpl implements ShellCommand {

    private ShellContext _context = null;

    public HelpCommandImpl(ShellContext context) {
        _context = context;
    }

    /**
     * @brief Renvoie le nom de la commande
     * @return le nom de la commande
     */
    public String getName() {
        return "help|?";
    }

    /**
     * @brief Renvoie la manière d'utiliser la commande
     * @return la manière d'utiliser la commande
     */
    public String getUsage() {
        return "help|?";
    }

    /**
     * @brief Renvoie la description de la commande
     * @return la description de la commande
     */
    public String getShortDescription() {
        return "display shell commands.\n";
    }

    /**
     * @brief Exécute la commande
     * @param cmdline : commande à exécuter
     * @param out : flux d'affichage std
     * @param err : flux d'affichage err
     * @return les données à afficher
     * @throws java.lang.Exception : erreur durant l'exécution de la méthode
     */
    public String execute(String cmdline, PrintStream out, PrintStream err) {
        StringBuffer res = new StringBuffer();
        try {
            ShellCommand[] cmds = _context.getCommandsHelp();
            String[] usage = new String[cmds.length];
            String[] desc = new String[cmds.length];
            int maxUsage = 0;
            for (int i = 0; i < cmds.length; i++) {
                usage[i] = cmds[i].getUsage();
                desc[i] = cmds[i].getShortDescription();
                // Just in case the command has gone away.
                if ((usage[i] != null) && (desc[i] != null)) {
                    maxUsage = Math.max(maxUsage, usage[i].length());
                }
            }
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < cmds.length; i++) {
                // Just in case the command has gone away.
                if ((usage[i] != null) && (desc[i] != null)) {
                    sb.delete(0, sb.length());
                    for (int j = 0; j < (maxUsage - usage[i].length()); j++) {
                        sb.append(' ');
                    }
                    res.append(usage[i] + sb + " - " + desc[i]);
                }
            }
        } catch (Exception ex) {
            err.println(ex.toString());
        }
        return res.toString();
    }
}
